
/**热更新相关*/
export namespace HotUpdate {
    export interface Manifest {
        /**大厅版本 */
        version?: string,
        /**子游戏版本 大厅的manifest不包含该字段 */
        subVersion?: string,
        /**资源服务器地址 */
        packageUrl?: string,
        /**远程project.manifest地址 */
        remoteManifestUrl?: string,
        /**远程version.manifest地址 */
        remoteVersionUrl?: string,
        /**包含资源 */
        assets?: any,
        searchPaths?: any
    }
    /**下载信息 */
    export interface DownLoadInfo {
        /**下载当前数据大小 */
        downloadedBytes: number,
        /**下载数据总大小 */
        totalBytes: number,
        /**当前下载文件数量 */
        downloadedFiles: number,
        /**当前下载的总文件数量 */
        totalFiles: number,
        /**下载总进入 */
        percent: number,
        /**下载当前文件的进度 */
        percentByFile: number,
        /**下载Code */
        code: Code,
        /**下载State */
        state: State,
        /**是否需要重启 */
        needRestart: boolean
    }
    /**提示下载弹出框事件数据 */
    export interface MessageData {
        state: State;
        /**下载的bundle */
        bundle: string;
        /**下载的bundle名，如大厅 */
        name: string;
        /**是否点击了确定按钮 true为下载 */
        isOk: boolean;
    }
    /**下载事件 */
    export enum Event {
        /**热更新事件*/
        HOTUPDATE_DOWNLOAD = "HOTUPDATE_DOWNLOAD",
        /**下载进度 */
        DOWNLOAD_PROGRESS = "DOWNLOAD_PROGRESS",
        /**提示下载弹出框事件 */
        DOWNLOAD_MESSAGE = "DOWNLOAD_MESSAGE",
    }
    export enum Code {
        /**找不到本地mainfest文件*/
        ERROR_NO_LOCAL_MANIFEST,
        /**下载manifest文件错误 */
        ERROR_DOWNLOAD_MANIFEST,
        /**解析manifest文件错误 */
        ERROR_PARSE_MANIFEST,
        /**找到新版本 */
        NEW_VERSION_FOUND,
        /**当前已经是最新版本 */
        ALREADY_UP_TO_DATE,
        /**更新下载进度中 */
        UPDATE_PROGRESSION,
        /**资源更新中 */
        ASSET_UPDATED,
        /**更新错误 */
        ERROR_UPDATING,
        /**更新完成 */
        UPDATE_FINISHED,
        /**更新失败 */
        UPDATE_FAILED,
        /**解压资源失败 */
        ERROR_DECOMPRESS,

        //以下是js中扩展的字段，上面是引擎中已经有的字段
        /**正检测更新中 */
        CHECKING,
    }
    export enum State {
        /**未初始化 */
        UNINITED,
        /**找到manifest文件 */
        UNCHECKED,
        /**准备下载版本文件 */
        PREDOWNLOAD_VERSION,
        /**下载版本文件中 */
        DOWNLOADING_VERSION,
        /**版本文件下载完成 */
        VERSION_LOADED,
        /**准备加载project.manifest文件 */
        PREDOWNLOAD_MANIFEST,
        /**下载project.manifest文件中 */
        DOWNLOADING_MANIFEST,
        /**下载project.manifest文件完成 */
        MANIFEST_LOADED,
        /**需要下载更新 */
        NEED_UPDATE,
        /**准备更新 */
        READY_TO_UPDATE,
        /**更新中 */
        UPDATING,
        /**解压中 */
        UNZIPPING,
        /**已经是最新版本 */
        UP_TO_DATE,
        /**更新失败 */
        FAIL_TO_UPDATE,

        /**自定定义扩展 */
        /**尝试重新下载失败文件 */
        TRY_DOWNLOAD_FAILED_ASSETS,
    }

    export class BundleConfig {
        /**Bundle名 如:hall*/
        bundle: string = "";
        /**Bundle名 如:大厅  */
        name: string = "";
        /**是否需要提示弹出框提示升级 */
        isNeedPrompt: boolean = false;
        /**
         * 
         * @param name bundle名 如：大厅
         * @param bundle Bundle名 如:hall
         * @param index 游戏index,可根据自己需要决定需不需要
         * @param event 加载bundle完成后，派发事件
         * @param isNeedPrompt 是否需要弹出提示升级的弹出框
         */
        constructor(
            name: string,
            bundle: string,
            isNeedPrompt: boolean = false) {
            this.name = name;
            this.bundle = bundle;
            this.isNeedPrompt = isNeedPrompt;
        }

        clone(){
            return BundleConfig.clone(this);
        }

        static clone( config : BundleConfig){
            let result = new BundleConfig(config.name,config.bundle,config.isNeedPrompt);
            return result;
        }
    }
}